package thread;

/*
死锁的产生有四个必要的条件:
    互斥使用: 即当资源被一个线程占用时，别的线程不能使用
    不可抢占: 资源请求者不能强制从资源占有者手中抢夺资源，资源只能由占有者主动释放
    请求和保持: 当资源请求者在请求其他资源的同时保持对原因资源的占有
    循环等待: 多个线程存在环路的锁依赖关系而永远等待下去，例如T1占有T2的资源，T2占有T3的资源，T3占有T1的资源，这种情况可能会形成一个等待环路
    对于死锁产生的四个条件只要能破坏其中一条即可让死锁消失，但是条件一是基础，不能被破坏。
*/
public class test12 {
    public static void main(String[] args) {
        Object locked1=new Object();
        Object locked2=new Object();
        Thread t1=new Thread(()->{
            synchronized (locked1){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (locked2){
                    System.out.println("t1");
                }
            }
        });
        Thread t2=new Thread(()->{
            synchronized (locked2){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (locked1){
                    System.out.println("t2");
                }
            }
        });
        t1.start();
        t2.start();
    }
}
